package camadaRN;

import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import camadaSO.IServidorClienteRMI;

public class RNEliteSquadServer{

	private static RNEliteSquadServer rnServer;
	private camadaSO.ServidorRMI servidor;
	
    private List<RNUsuarioServer> usuariosConectados;
	private List<RNPartidaServer> partidas;	
	
    public static RNEliteSquadServer getRNServer() {
        if (rnServer == null) {
        	rnServer = new RNEliteSquadServer();
        }
        return rnServer;
    }
    private RNEliteSquadServer() {
    	 try {
             setServidor(new camadaSO.ServidorRMI());
         } catch (java.rmi.RemoteException ex) {
         }
         criaListas();
    }   
    
    public boolean iniciarServidor() {
        //inicia o RMI    	
		try {
			setServidor(new camadaSO.ServidorRMI());
			return getServidor().iniciarServidorRMI();
		} catch (RemoteException e) {
			e.printStackTrace();
		}
        return false;
    }

    public boolean finalizarServidor() {    	
        //finaliza o RMI
        boolean error = getServidor().finalizarServidorRMI();
        setServidor(null);
        return error;
    }
	
	@SuppressWarnings("unchecked")
	private void criaListas(){
		usuariosConectados = new ArrayList<RNUsuarioServer>();
		partidas = new ArrayList<RNPartidaServer>();
	}	

	public void adicionaUsuarioLista(RNUsuarioServer usuarioServer){
			getUsuariosConectados().add(usuarioServer);
	}
	
	public void criarNovaPartida(RNUsuarioServer desafiante, String desafiado){
		RNPartidaServer partida = new RNPartidaServer(desafiante,getUsuariobyNome(desafiado));
		desafiante.setPartidaCorrente(partida);
		getUsuariobyNome(desafiado).setPartidaCorrente(partida);
	}

	public void passaListaPClientes(){
		System.out.println();
		List<String> nomes = new ArrayList<String>();
		List<String> senhas = new ArrayList<String>();
		List<Integer> pontuacoes = new ArrayList<Integer>();
		for(RNUsuarioServer outroUsuario: usuariosConectados){			
			System.out.println("RNServer: usuario "+outroUsuario.getNome()+" disponivel:"+
					outroUsuario.getStatus() +"\ncliente:"+
					outroUsuario.getClienteRespectivo());
			if(outroUsuario.getStatus()==true){
				nomes.add(outroUsuario.getNome());
				senhas.add(outroUsuario.getSenha());
				pontuacoes.add(outroUsuario.getPontuacao());
			}
		}		
		for(RNUsuarioServer usuario: usuariosConectados){		
			try {
				usuario.getClienteRespectivo().limpaListaAtual();
				usuario.getClienteRespectivo().passaListaPCliente(nomes,senhas,pontuacoes);
			} catch (RemoteException e) {
				e.printStackTrace();
			}
		}		
	}

	public void deslogaUsuario(RNUsuarioServer usuario){
		getUsuariosConectados().remove(usuario);

	}
	public RNUsuarioServer getUsuariobyNome(String nome){		
		for(RNUsuarioServer umUsuario: getUsuariosConectados()){
			if(umUsuario.getNome().equals(nome)) return umUsuario;
		}
		return null;
	}
	
	public boolean logarUsuario(String nome, String senha,String ipUsuario){
		
		
		
		RNUsuarioServer usuarioServer =new RNUsuarioServer(nome,senha);
		
		if(usuarioServer.validaDados()){
			camadaRN.RNEliteSquadServer.getRNServer().adicionaUsuarioLista(usuarioServer);
			
			//conecta A VOLTA COM O CLIENTE
			conectaCliente( ipUsuario,usuarioServer);
			
			return true;
		}else
			return false;
	}
	
	private void conectaCliente( String ipUsuario, RNUsuarioServer usuarioServer) {
		camadaSO.IServidorClienteRMI clienteRMI;
		try{
			//jeito de pegar IP
			System.out.println("cliente conectando: "+ipUsuario);
			
			clienteRMI = (camadaSO.IServidorClienteRMI) java.rmi.Naming.lookup(String.format("//"+ipUsuario+"//Cliente"));

			usuarioServer.setClienteRespectivo(clienteRMI);
			
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (NotBoundException e) {
			e.printStackTrace();
		}			
	}
	public boolean cadastrarUsuario(String nome, String senha){
		RNUsuarioServer usuarioServer =new RNUsuarioServer(nome,senha);
		if(!usuarioServer.persisteUsuario())
			return false;			
		return true;
	}
	
	public camadaSO.ServidorRMI getServidor() {
		return servidor;
	}
	public void setServidor(camadaSO.ServidorRMI servidor) {
		this.servidor = servidor;
	}
	public List<RNUsuarioServer> getUsuariosConectados() {
		return usuariosConectados;
	}
	public void setUsuariosConectados(List<RNUsuarioServer> usuariosConectados) {
		this.usuariosConectados = usuariosConectados;
	}
	public List<RNPartidaServer> getPartidas() {
		return partidas;
	}
	public void setPartidas(List<RNPartidaServer> partidas) {
		this.partidas = partidas;
	}
}
